package cn.xxi.ai.file.storage;

import cn.xxi.ai.config.MinioProperties;
import cn.xxi.ai.util.SpringContextHolder;
import io.minio.GetObjectArgs;
import io.minio.GetObjectResponse;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.io.InputStream;

/**
 * MinIO 文件存储服务
 * 封装 MinIO 的上传与访问操作
 * 
 * @author bingo
 */
@Service
@RequiredArgsConstructor
public class MinioStorage {

    private final MinioClient minioClient;
    private final MinioProperties minioProperties;

    /**
     * 上传文件到 MinIO
     *
     * @param inputStream  输入流
     * @param objectName   文件对象名（即路径）
     * @param size         文件大小（字节）
     * @param contentType  内容类型（MIME）
     */
    public void putObject(InputStream inputStream, String objectName, long size, String contentType) throws Exception {
        minioClient.putObject(
            PutObjectArgs.builder()
                .bucket(minioProperties.getBucket())
                .object(objectName)
                .stream(inputStream, size, -1)
                .contentType(contentType)
                .build()
        );
    }

    /**
     * 获取文件流
     *
     * @param objectName 文件对象名
     * @return GetObjectResponse 文件流响应
     */
    public GetObjectResponse getObject(String objectName) throws Exception {
        return minioClient.getObject(
            GetObjectArgs.builder()
                .bucket(minioProperties.getBucket())
                .object(objectName)
                .build()
        );
    }

    /**
     * 静态方法：通过文件名获取访问 URL
     *
     * @param objectName 文件对象名
     * @return 完整 URL
     */
    public static String getUrl(String objectName) {
        MinioProperties properties = SpringContextHolder.getBean(MinioProperties.class);
        return properties.getEndpoint() + "/" + properties.getBucket() + "/" + objectName;
    }
}
